/blog/archive/

Rust default function parameters and Clap-rs argument YAMLs

created: 2020-12-26T15:47:01Z
modified: 2020-12-26T15:47:01Z

Being new to Rust and coming from dramatically different languages naturally I searched last night for how to handle default function parameters. I had thought that surely I was just missing some obscure little syntactical trick that would make them work, I was surprised when a handful of searches camme back with:

Rust doesn’t support default function arguments.

Ok. Took a little bit to digest. I actually slept on it and then it came to me this morning.

"I can just use a struct constructor, should be easy." - thoughts in my head

Cargo.toml

[dependencies]
clap = { git = "https://github.com/clap-rs/clap/", features = ["yaml"] }

Yeah, I know. It’s the beta 1, hang with me.

main.rs

extern crate clap;

struct State {
    verbose: bool,
}

impl State {
    fn new() -> State {
        State {
            verbose: false,
        }
    }
}

fn main() {
    let mut state = State::new();
    use clap::{load_yaml, App};
    let yml = load_yaml!("cli.yml");
    let matches = App::from(yml).get_matches();
    
    if matches.is_present("verbose") {
        state.verbose = true;
    }

    something(state)
}

fn something(state: State) {
    println!("What’s our state? {:?}", state.verbose)
}

NOTE: No need for the cfg attribute in the Clap 3.x-beta1

All this talk of default arguments made me forget the real hotness, arg definitions in YAML!

cli.yml

name: verbose_app
version: "0.1"
about: This does next to nothing except take verbose flag
author: gatewaynode <44749714+gatewaynode@users.noreply.github.com>

args:
    - verbose:
        short: v
        long: verbose
        takes_value: false
  • Creative Commons License
  • Author: Gatewaynode